﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Controls.DataVisualization.Charting;
using Galaktika.BI.Runtime.Services;
using System.Reflection;
using Galaktika.BI.Extensibility.Dom;

namespace Galaktika.BI.Charting
{
    public static class PaletteHelper
    {
        private static Dictionary<string, PaletteCollection> m_PaletteRepository;
        
        public static void InitializePalette(IAppManager service)
        {            
           
            string str = "";
            //var x = member[0].Invoke(Activator.CreateInstance(t),new object[]{str});
            //foreach (var member in members)
            //{
            //    BrickPalette pal = new BrickPalette("");
            //    PaletteCollection coll = new PaletteCollection();
            //    foreach (var item in pal.Items)
            //    {
            //        PaletteChart colors = new PaletteChart();
            //        colors.Colors.Add(item.Color1);
            //        coll.Add(colors);
            //    }
            //    m_PaletteRepository.Add(str, coll);
            //}
        }

        public static BrickPalette GetPalette(string name, IAppManager service)
        {
            if ( service != null && service.ClientAssembly != null)
            {
                Type t = service.ClientAssembly.GetType("Global.PaletteRepository");
                object obj = null;
                if (t != null)
                    obj = Activator.CreateInstance(t);
                MethodInfo inf = t.GetMethod("GetPalette");
                BrickPalette pal = (BrickPalette)inf.Invoke(obj,new object[]{name});
                return pal;
            }
            return null;
        }
    }

    public class PaletteChart : IComparable
    {
        private string m_PaletteName;
        private List<Color> m_PaletteColors;
        private Color m_DefaultColor;

        #region Constructors
        /// <summary>
        /// Конструктор
        /// </summary>
        public PaletteChart()
            : this(string.Empty)
        {
        }

        public PaletteChart(string paletteName)
        {
            m_PaletteName = paletteName;
            m_PaletteColors = new List<Color>();
            //m_DefaultColor = Color.Silver;
        }
        #endregion Constructors

        #region Public Properies

        /// <summary>
        /// Имя палитры
        /// </summary>
        public string Name
        {
            get
            {
                return this.m_PaletteName;
            }
            set
            {
                this.m_PaletteName = value;
            }
        }

        /// <summary>
        /// Список цветов коллекции
        /// </summary>
        public List<Color> Colors
        {
            get
            {
                return this.m_PaletteColors;
            }
            set
            {
                this.m_PaletteColors = value;
            }
        }

        public Color DefaultColor
        {
            get
            {
                return this.m_DefaultColor;
            }
            set
            {
                this.m_DefaultColor = value;
            }
        }
        #endregion Public Properies

        #region Public Properies

        /// <summary>
        /// Добавляет новый цвет (дефолтный) в коллекцию цветов палитры
        /// </summary>
        public void AddColor()
        {
            this.AddColor(this.DefaultColor);
        }

        /// <summary>
        /// Добавляет новый цвет в коллекцию цветов палитры
        /// </summary>
        /// <param name="paletteColor">Цвет, добавляемый в колекцию цветов палитры</param>
        public void AddColor(Color paletteColor)
        {
            this.Colors.Add(paletteColor);
        }

        /// <summary>
        /// Добавляет новый цвет, если коллекция цветов палитры пустая
        /// </summary>
        public void AddDefaultColorIfEmpty()
        {
            if (this.Colors.Count == 0)
            {
                this.AddColor();
            }
        }

        // Создает копию палитры
        public object Clone()
        {
            PaletteChart paletteNew = (PaletteChart)base.MemberwiseClone();//(PaletteChart)this.Clone();
            return paletteNew;
        }
        #endregion Public Properies

        #region Ovverides Methods
        public override string ToString()
        {
            return this.Name;
        }
        #endregion Ovverides Methods

        #region IComparable Methods
        int IComparable.CompareTo(object paletteToCompare)
        {
            string paletteThisName = ((PaletteChart)this).Name;
            string paletteToCompareName = ((PaletteChart)paletteToCompare).Name;

            return paletteThisName.CompareTo(paletteToCompareName);
        }
        #endregion IComparable Methods
    }
}
